from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout, QLabel, QVBoxLayout, QLCDNumber, \
    QMessageBox, QProgressBar
from PyQt5.QtCore import QTimer, QDateTime, Qt, QThread, pyqtSignal
import sys
import ctypes

'''
QThread Class ：https://doc.qt.io/Qt-5/qthread.html
Public Functions
    eventDispatcher
    self.my_thaer.isFinished()          返回true线程是否完成；否则返回false。
    self.my_thaer.idealThreadCount()    返回可以在系统上运行的理想线程数(int)
    *self.my_thaer.quit()                无效的：安全终止线程
    self.my_thaer.terminate()           【终止】线程自身无法清除，解锁任何保持的互斥锁等。总之，仅在绝对必要时才使用此功能
    *self.my_thaer.finished()            该信号在执行完成之前立即从关联线程发出。注意：如果关联的线程使用终止，则不确定从哪个线程发出该信号。
                                        注意：这是一个私人信号。它可以用于信号连接，但不能由用户发射。

'''


class ui(QWidget):
    def __init__(self):
        super().__init__()

        self.win = QWidget()
        layout = QVBoxLayout(self)
        self.win.resize(50, 50)

        self.btn = QPushButton(self)
        self.btn_ = QPushButton(self)

        self.btn2 = QPushButton(self)
        self.btn2_ = QPushButton(self)

        self.progressBar = QProgressBar()
        self.progressBar_ = QProgressBar()

        self.btn.setText('开始')
        self.btn_.setText('开始_')

        self.btn2.setText('停止')
        self.btn2_.setText('停止_')

        self.lab = QLabel(self)
        self.lab_ = QLabel(self)

        self.lab.setText('我是ui界面的默认内容')
        self.lab_.setText('我是ui界面的默认内容_')

        # 绑开始按钮的信号与槽绑定
        self.btn.clicked.connect(self._Slot)
        self.btn_.clicked.connect(self._Slot_)

        # 结束按钮的信号与曹绑定
        self.btn2.clicked.connect(self.stopThread)
        self.btn2_.clicked.connect(self.stopThread_)

        # 定义线程
        self.my_thaer = thread('第1条线程正在运行,我来自UI')
        self.my_thaer_ = thread('第2条线程正在运行,我来自UI')

        # 线程的信号与UI的槽进行连接
        self.my_thaer.signal.connect(self.updat_lab)
        self.my_thaer_.signal.connect(self.updat_lab_)

        layout.addWidget(self.btn)
        layout.addWidget(self.btn_)

        layout.addWidget(self.btn2)
        layout.addWidget(self.btn2_)

        layout.addWidget(self.lab)
        layout.addWidget(self.lab_)

        layout.addWidget(self.progressBar)
        layout.addWidget(self.progressBar_)

    def _Slot(self):
        # 界面ui发出信号
        print("界面ui发出信号")
        # self.siganl.emit()
        self.my_thaer.start()

    def _Slot_(self):
        # 界面ui发出信号
        print("界面ui发出信号_")
        # self.siganl.emit()
        self.my_thaer_.start()


    def updat_lab(self, item):
        self.lab.setText('我是从线程里面传来的更新信号,传递过来的参数是%s' % (item))
        self.progressBar.setValue(item)

    def updat_lab_(self, item):
        self.lab_.setText('我是从线程里面传来的更新信号,传递过来的参数是%s_' % (item))
        self.progressBar_.setValue(item)

    def stopThread(self):
        print('ui界面发出了 停止 信号')
        self.my_thaer.terminate()  # 这里是停止线程的关键点[进程终止]
        self.btn2.setText('停止')
        self.progressBar.setValue(0)

    def stopThread_(self):
        print('ui界面发出了 停止 信号')
        self.my_thaer_.terminate()  # 这里是停止线程的关键点[进程终止]
        self.btn2_.setText('停止_')
        self.progressBar_.setValue(0)

class thread(QThread):

    def __init__(self, data, parent=None):
        QThread.__init__(self, parent)
        self.data = data

    # 定义一个具有传递int参数的信号
    signal = pyqtSignal(int)

    def run(self):
        for i in range(1000000):
            self.sleep(1)
            # 线程类发出信号
            self.signal.emit(i)
            print('这是来自UI传进线程的参数:%s'%self.data)
            print('这是从线程中发出信号%d' % i)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = ui()
    win.show()

    sys.exit(app.exec())